import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;


public class GestorPistas {
	
	final static int ATERRAR = 0;
	final static int DESCOLAR = 1;
	final static int P_ID_ATERRAGEM = 1;
	final static int P_ID_DESCOLAGEM = 2;
	final static int P_ID_MISTA = 3;
	
	
	private Pista pistaAterragem = new Pista(P_ID_ATERRAGEM,"Aterragem");
	private Pista pistaDescolagem = new Pista(P_ID_DESCOLAGEM,"Descolagem");
	private Pista pistaMista = new Pista(P_ID_DESCOLAGEM,"Mista");
	
	private ReentrantLock mutex = new ReentrantLock();
    private Condition condAterrar = mutex.newCondition();
    private Condition condLevantar = mutex.newCondition();
    
    private int numAterrarEspera = 0;
    private int numDescolarEspera = 0;
    
    private void printInfoPistas(){
		System.out.println("_______________Info Pistas______________");
		System.out.println("Pista 1		|Pista 2	|Pista 3");
		System.out.println("Aterragem	|Descolagem	|Mista");
		System.out.println(pistaAterragem.descricao()+"		|"+pistaDescolagem.descricao()+
				"		|"+ pistaMista.descricao());

	}
    
    public void obterPista(int aterrarDescolar, ThreadCli cli) throws InterruptedException{
		mutex.lock();
		
		switch (aterrarDescolar) {
		case ATERRAR:
			numAterrarEspera++;
			while(pistaAterragem.ocupada() && pistaMista.ocupada()){
				condAterrar.await();
			}
			numAterrarEspera--;
			if(pistaAterragem.livre())
				pistaAterragem.reservar(cli);
			else
				pistaMista.reservar(cli);
			break;
		case DESCOLAR:
			numDescolarEspera++;
			while(pistaDescolagem.ocupada() && pistaMista.ocupada()){
				condAterrar.await();
			}
			numDescolarEspera--;
			if(pistaDescolagem.livre())
				pistaDescolagem.reservar(cli);
			else
				pistaMista.reservar(cli);
			break;
		}
		printInfoPistas();
	}
	
	public void libertarPista(Pista pista){
		mutex.lock();
		pista.libertar();
		switch(pista.getID()){
			case P_ID_ATERRAGEM:
				condAterrar.signal();
				break;
			case P_ID_DESCOLAGEM:
				condLevantar.signal();
				break;
			case P_ID_MISTA:
				if(numAterrarEspera>0)
					condAterrar.signal();
				else
					condLevantar.signal();
				break;
		}
		mutex.unlock();
		printInfoPistas();
		
	}

}
